function minimumCost (n, connections) {
  let uf = new UnionFind(n + 1) // 因为编号是1~n 所以是n+1
  // 对所有的cost进行从小到大的排序
  connections.sort((a, b) => a[2] - b[2])
  let mst = 0 // 最小权重和
  for (let edge of connections) {
    let from = edge[0]
    let to = edge[1]
    let cost = edge[2] // 获得起点 重点  花费
    if (uf.connected(from, to)) {
      // 如果遍历的过程中这个边产生环形了 那这个边就不是最小生成树的一部分
      continue
    }
    // 加入没有产生换 表示这个边是最小生成树的一部分  计算权重和
    mst += cost
    uf.union(from, to) // 连接两条边
  }
  return uf.getCount() === 2 ? mst : -1 // 因为有0占位 所以这个最后悔是2  否则的话 布置有两个 就返回-1  不能形成最小生成树
}
class UnionFind {
  constructor(n) { // n表示图纸节点的个数
    this.count = n // 连通分量的个数
    this.parent = new Array(n) // 储存每个节点的父节点  下标代表节点的编号 值是节点的父节点
    for (let i = 0; i < n; i++) {
      this.parent[i] = i // 初始化每个节点的父节点都是自己本身
    }
  }
  union (p, q) {
    let rootP = this.find(p)
    let rootQ = this.find(q)
    if (rootP === rootQ) {
      return
    }
    this.parent[rootP] = rootQ // 让其中一个指向另一个的父节点
    this.count-- // 连通的分量减一  因为两个合成了一个了
  }
  connected (p, q) {
    let rootP = this.find(p)
    let rootQ = this.find(q)
    return rootQ === rootP // 找到两个的根节点 判断是不是相同
  }
  find (x) {
    if (this.parent[x] !== x) {
      this.parent[x] = this.find(this.parent[x])
    }
    return this.parent[x]
  }
  getCount () {
    return this.count // 返回连通量的个数
  }
}
let n = 3, connections = [[1, 2, 5], [1, 3, 6], [2, 3, 1]]
console.log(minimumCost(n, connections))